package com.gzy.rpsm.property.pojo;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import lombok.Data;

import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

// final表示类不能被继承

/**
 * 最后要返回给前端的分页数据的封装。
 * 主要包括：
 * total - 总记录数
 * list - 当前页数据列表
 * pageNum - 要查询页码(可以不返回，因为这就是前端传过来的)
 * pageSize - 每页显示记录数(可以不返回，因为这就是前端传过来的)
 */

@Data
public final class PageResult<T> {
    private final Integer pageNum;
    private final Integer pageSize;
    private final Long total;
    private final List<T> list;

    public PageResult(@NotNull Integer pageNum, @NotNull Integer pageSize, @NotNull Long total, @NotNull List<T> list) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
    }

    public static <T> PageResult<T> restPage(@NotNull Integer pageNum,
                                             @NotNull Integer pageSize,
                                             @NotNull Long total,
                                             @Nullable List<T> list) {
        return new PageResult<>(pageNum, pageSize, total,
                Optional.ofNullable(list).orElse(Collections.emptyList()));
    }

    public static <T> PageResult<T> restPage(@NotNull Page<T> page) {
        return new PageResult<>(page.getPageNum(),
                page.getPageSize(), page.getTotal(), page.getResult());
    }

    public static <T> PageResult<T> restPage(@NotNull PageInfo<T> page) {
        return new PageResult<>(page.getPageNum(),
                page.getPageSize(), page.getTotal(), page.getList());
    }
}
